home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Updates
/
HD-Installer
/
-WHDLoad-
/
WHDLoad_dev
/
Patcher1.04
/
PARAMQTX
/
imagernitro.asm
< prev
next >
Wrap
Assembly Source File
|
1999-11-08
|
17KB
|
848 lines
;another example of a formatconversion, this time for a hd-install
;the nitro-disk has a really strange decoding-routine
;have a look on that table-changes while execution
INCDIR ASM-ONE:INCLUDE2.0/
INCLUDE OWN/Patcher.I
INCLUDE DEVICES/TRACKDISK.I
INCLUDE EXEC/EXEC_LIB.I
INCLUDE EXEC/IO.I
INCLUDE LIBRARIES/DOS_LIB.I
MYNITRO=0
HP MOVEQ.L #20,D0
RTS
DC.L TAB
DC.B 'PTCH'
DC.B '$VER:Nitro_Diskimager_V1.1',0
EVEN
TAB DC.L PCH_INIT,INITROUT
DC.L PCH_FILECOUNT,3
DC.L PCH_ADAPTOR,ADNAME
DC.L PCH_DISKNAME,DISKNAMEARRAY
DC.L PCH_FILENAME,FILENAMEARRAY
DC.L PCH_CHANGES,CHANGESARRAY
DC.L PCH_NAME,PARAMNAME
DC.L PCH_DATALENGTH,LENGTHTABLE
DC.L PCH_SPECIAL,SPECIALARRAY
DC.L PCH_STATE,STATEARRAY
DC.L PCH_STATE2,STATEARRAY2
DC.L PCH_MINVERSION,VERSNAME ;minimum version of THE PATCHER
DC.L 0
;minimum version of the patcher required, its a commandline-parameter
VERSNAME DC.B 'V1.01' ;MAY NOT CONTAIN HEADING ZEROES
EVEN ;MUST CONTAIN 2 NUMBERS AFTER POINT
ADNAME DC.B 'Done by Harry.',0
EVEN
PARAMNAME DC.B 'Nitro, Diskimager for HD-install',0
EVEN
DISKNAMEARRAY DC.L DISK1NAME
DC.L DISK1NAME
DC.L DISK1NAME
DISK1NAME DC.B 'Nitro',0
EVEN
FILENAMEARRAY DC.L FILE1NAME
DC.L FILE2NAME
DC.L FILE3NAME
FILE2NAME DC.B 'disk.1',0
EVEN
FILE1NAME DC.B 'init',0
EVEN
FILE3NAME DC.B 'high',0
EVEN
LENGTHTABLE DC.L $1200
DC.L $0 ;WILL BE EVALUATED IN CYCLE1
DC.L $140 ;HIGHSCORE!
CHANGESARRAY DC.L 0 ;no changes to make in cycle 1
DC.L 0 ;no changes to make in cycle 2
DC.L 0 ;if no highscores were on disk,
;they will be generated
;the parameter-initializing opens sourcedevice
INITROUT
MOVEQ.L #0,D0
MOVE.L PTB_OPENDEVICE(A5),A0
JSR (A0)
TST.L D0
RTS
;loading-statetexts for the cycles
STATEARRAY DC.L LOADSTATE2
DC.L LOADSTATE2
DC.L LOADSTATE2
LOADSTATE2
DC.B 'Please insert your original writepro-',$A
DC.B 'tected disk in the source drive.',0
EVEN
STATEARRAY2 DC.L SAVESTATE ;no text in cycle 1
DC.L SAVESTATE
DC.L SAVESTATE
SAVESTATE
DC.B 'Please insert your destination disk.',0
EVEN
;routines to 'load' something
SPECIALARRAY DC.L LOADROUT2 ;load dual-formatted track 0
DC.L LOADROUT ;load stuff from original
DC.L LOADROUT3 ;load highscore
LOADROUT2
MOVEQ.L #0,D7
.NEU
.4 MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.W #TD_CHANGESTATE,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L IO_ACTUAL(A1)
BNE.W .NOTORG
MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L PTB_ADDRESSOFFILE(A5),IO_DATA(A1)
MOVE.L #$1200,IO_LENGTH(A1)
MOVE.L #$400,IO_OFFSET(A1)
MOVE.W #CMD_READ,IO_COMMAND(A1)
CLR.L IOTD_SECLABEL(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L D0
BNE.W .ERR
;LOAD CHECKDISKTRACK
MOVEQ.L #0,D2
LEA.L TRACKDATALENGTH(PC),A2
MOVEQ.L #0,D4
.3 TST.L D4
BNE.S .1
.5 MOVEQ.L #$4,D5 ;4 tries, then error
.55 MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L PTB_SPACE(A5),IO_DATA(A1) ;track is to load in PTB_SPACE
MOVE.L #$7C00,IO_LENGTH(A1) ;double length of track
;to decode the index-sync-read data
MOVE.L D2,D0 ;my own trackcounter
MOVE.L D0,IO_OFFSET(A1)
MOVE.W #TD_RAWREAD,IO_COMMAND(A1)
MOVE.B #IOTDB_INDEXSYNC,IO_FLAGS(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L D0
BNE.W .ERR
MOVE.L PTB_SPACE(A5),A0
LEA.L $7C00(A0),A1 ;end of buffer
LEA.L $7C02(A0),A3
BSR.W TRACKDECODE3
TST.L D0
BEQ.S .OK
DBF D5,.55
BRA.W .NOTORG
.OK
CMP.L #'tb_1',(A3) ;nitro-diskname
BNE.S .ERR
LEA.L $8(A3),A3
MOVE.L #$A0,D3
.1 MOVE.L D4,D0
LSL.L #1,D0
MOVE.W (A3,D0.W),D0
AND.W #$FFF,D0
MOVE.W D0,(A2)+
ADDQ.L #1,D4
CMP.W D3,D4 ;tracklength
BNE.S .2
MOVEQ.L #0,D4 ;new track
.2
TST.L D4
BNE.S .3
LEA.L TRACKDATALENGTH,A0 ;evaluate disksize needed in
MOVEQ.L #0,D0 ;next cycle (cycle 2)
.T1 MOVEQ.L #0,D1
MOVE.W (A0)+,D1
ADD.L D1,D0
CMP.L #TRACKDATALENGTHEND,A0
BNE.S .T1
LSL.L #2,D0
MOVE.L D0,LENGTHTABLE+4 ;store length in right table
; ^-^-^-^-^-^
MOVEQ.L #0,D4
.END MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L #0,IO_LENGTH(A1)
MOVE.W #TD_MOTOR,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
MOVE.L D4,D0
RTS
.ERR MOVEQ.L #-1,D4
BRA.S .END
.NOTORG TST.L D7
BNE.S .ERR
ST D7
LEA.L LINE1(PC),A0
LEA.L LINE2(PC),A1
MOVE.L PTB_REQUEST(A5),A6
JSR (A6)
TST.L D0
BNE.S .ERR
BRA.W .NEU
LOADROUT
;.xxx bra.s .xxx
MOVEQ.L #0,D7 ;one diskchange allowed
.NEU
.4 MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;disk in sourcedrive?
MOVE.W #TD_CHANGESTATE,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L IO_ACTUAL(A1)
BNE.W .NOTORG
MOVE.L PTB_ADDRESSOFFILE(A5),A4 ;load first part of disk
LEA.L (A4),A2 ;offset to load in the dataspace
MOVEQ.L #0,D2 ;starttrack on the disk
MOVEQ.L #0,D4 ;data from the start of the track
; bra.s .5 ;because reading starts with
;trackstart, this is obsolete
.3 TST.L D4
BNE.W .1
MOVE.L D2,D0
LSL.L #1,D0
LEA.L TRACKDATALENGTH(PC),A0
TST.W (A0,D0.W)
BEQ.W .SKIPEMPTY
.5 MOVEQ.L #$4,D5 ;4 tries, then error
.55 MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L PTB_SPACE(A5),IO_DATA(A1) ;track is to load in PTB_SPACE
MOVE.L #$7C00,IO_LENGTH(A1) ;double length of track
;to decode the index-sync-read data
MOVE.L D2,D0 ;my own trackcounter
MOVE.L D0,IO_OFFSET(A1)
MOVE.W #TD_RAWREAD,IO_COMMAND(A1)
MOVE.B #IOTDB_INDEXSYNC,IO_FLAGS(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L D0
BNE.W .ERR
MOVE.L #$AAAAAAAA,ANDVALUE
MOVE.L PTB_SPACE(A5),A0
LEA.L $7C00(A0),A1 ;end of buffer
LEA.L $7C00(A0),A3
BSR.W TRACKDECODE2
TST.L D0
BEQ.S .R1OK
MOVE.L #$55555555,ANDVALUE
MOVE.L PTB_SPACE(A5),A0
LEA.L $7C00(A0),A1 ;end of buffer
LEA.L $7C00(A0),A3
BSR.W TRACKDECODE2
TST.L D0
BEQ.S .R1OK
DBF D5,.55
BRA.W .NOTORG
.R1OK MOVE.W D1,D3
LSL.W #2,D3
ST D7 ;correct disk - nothing anymore
;to change
.1 MOVE.B (A3,D4.W),(A2)+
ADDQ.L #1,D4
CMP.W D3,D4 ;tracklength
BNE.S .2
.SKIPEMPTY
MOVEQ.L #0,D4 ;new track
ADDQ.L #1,D2
.2
TST.L D4
BNE.W .3
CMP.L #$A0,D2 ;UNTIL END OF DISK IS REACHED
BNE.W .3
MOVEQ.L #0,D4
.END MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;switch motor off
MOVE.L #0,IO_LENGTH(A1)
MOVE.W #TD_MOTOR,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
MOVE.L D4,D0
RTS
.ERR MOVEQ.L #-1,D4
BRA.S .END
.NOTORG TST.L D7 ;if the first time the original
BNE.S .ERR ;was not in the source drive,
ST D7 ;youll be asked to put it there
LEA.L LINE1(PC),A0
LEA.L LINE2(PC),A1
MOVE.L PTB_REQUEST(A5),A6
JSR (A6)
TST.L D0
BNE.S .ERR
BRA.W .NEU
LOADROUT3
MOVEQ.L #0,D7 ;one diskchange allowed
.NEU
.4 MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;disk in sourcedrive?
MOVE.W #TD_CHANGESTATE,IO_COMMAND(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L IO_ACTUAL(A1)
BNE.W .NOTORG
MOVE.L PTB_ADDRESSOFFILE(A5),A4 ;load first part of disk
LEA.L (A4),A2 ;offset to load in the dataspace
MOVEQ.L #2,D2 ;starttrack on the disk
MOVEQ.L #0,D4 ;data from the start of the track
; bra.s .5 ;because reading starts with
;trackstart, this is obsolete
.3 TST.L D4
BNE.W .1
.5 MOVEQ.L #$4,D6 ;4 tries, then error
.55 MOVE.L PTB_DEVICESOURCEPTR(A5),A1
MOVE.L PTB_SPACE(A5),IO_DATA(A1) ;track is to load in PTB_SPACE
MOVE.L #$7C00,IO_LENGTH(A1) ;double length of track
;to decode the index-sync-read data
MOVE.L D2,D0 ;my own trackcounter
MOVE.L D0,IO_OFFSET(A1)
MOVE.W #TD_RAWREAD,IO_COMMAND(A1)
MOVE.B #IOTDB_INDEXSYNC,IO_FLAGS(A1)
MOVE.L (_SYSBASE).W,A6
JSR _LVODOIO(A6)
TST.L D0
BNE.W .ERR
MOVE.L PTB_SPACE(A5),A0
LEA.L $7C00(A0),A1 ;end of buffer
LEA.L $7C02(A0),A3 ;due checksum
BSR.W TRACKDECODE
TST.L D0
BEQ.S .R1OK
DBF D6,.55
BRA.W .NOTORG
.R1OK MOVE.W #$140,D3
ADDQ.L #1,D2
ST D7 ;correct disk - nothing anymore
;to change
.1 MOVE.B (A3,D4.W),(A2)+
ADDQ.L #1,D4
CMP.W D3,D4 ;tracklength
BNE.S .2
MOVEQ.L #0,D4 ;new track
.2
TST.L D4
BNE.W .3
CMP.L #$3,D2 ;UNTIL TRACK $3 IS REACHED
BNE.W .3
MOVE.L PTB_ADDRESSOFFILE(A5),A4 ;check if highscores were saved
MOVE.W #$140-1,d0
.H2 TST.B (A4)+
BNE.S .H
DBF D0,.H2
MOVE.L #HITAB,CHANGESARRAY+2*4 ;if not, generate them
.H
MOVEQ.L #0,D4
.END MOVE.L PTB_DEVICESOURCEPTR(A5),A1 ;switch motor off
MOVE.L #0,IO_L